iT邦幫忙

2024 iThome 鐵人賽

0
Software Development

從Servlet到Spring MVC系列 第 33

Day32 Spring MVC - Exception Handling

  • 分享至 

  • xImage
  •  

前言

我們在Day19的時候有說過在Servlet中如何處理程式運行中的錯誤並導向錯誤頁面,今天我們就來瞧瞧Spring MVC如何來處理這一塊的問題

錯誤處理分為編程式異常處理也就是透過Try-catch block、throw的方式來處理,當處理的量一多到處都是充斥著Try-catch block、throw屆時就會越變得比較不好維護,與之對比聲明式異常處理可以將錯誤訊息集中管理,開發人員可以更集中在商業邏輯開發,這樣的作法會是相對比較推薦的

0.創建module

(1) 請參考Day27 module
(2) 使用JSON相關設置請參考Day29

一、XML配置ExceptionResolver

Spring MVC提供了定義了一個Interface HandleExceptionResolver來處理Exception,並有兩個實作類別SimpleMappingExceptionResolver、DefaultHandlerExceptionResolve,若想要使用自訂義的異常處理我們可以配置SimpleMappingExceptionResolver來達成

測試案例建置

springmvc-servlet.xml配置

<bean
    class="org.springframework.web.servlet.handler.SimpleMappingExceptionResolver">
      <property name="exceptionMappings">
          <props>
              <!--
              出現指定異常則返回特定葉面
              -->
              <prop key="java.lang.ArithmeticException">error</prop>
          </props>
      </property>
      <!--
      透過屬性設置exceptionAttribute,頁面可以共享此數據
      -->
      <property name="exceptionAttribute" value="ex"></property>
  </bean>

error.jsp

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>Exception Demo</title>
</head>
<body>
    <h3>Exception Demo</h3>
    ${ex.message}
</body>
</html>

controller

@Controller
@ResponseBody
public class ExceptionDemoController {

    @GetMapping("Demo1")
    public String Demo1(){
        int i = 1/0;
        return "Demo1";
    }
}

Demo

https://ithelp.ithome.com.tw/upload/images/20241017/20128084eZX29hTds2.png

二、annotation配置ExceptionResolver

(1) @ExceptionHandler

配置局部的ExceptionHandler

範例建置

記得先把Demo1配置的SimpleMappingExceptionResolver註解起來

@Controller
public class ExceptionDemoAnnotationController {

    @GetMapping("Demo2")
    public String Demo2(){
        int[] arr = new int[10];
        arr[10] = 1;
        return "Hello Demo2";
    }

    @ExceptionHandler(Exception.class)
    public String HandleDemo2Exception(Exception ex, Model model){
        model.addAttribute("ex",ex);
        return "error";
    }
}

Demo

https://ithelp.ithome.com.tw/upload/images/20241017/20128084GYdOvIsLqp.png

(2) @ControllerAdvice

透過此註解可以統一集中管理Exception處理

範例建置

ExceptionAdviceDemoController

@Controller
@ResponseBody
public class ExceptionAdviceDemoController {

    @GetMapping("Demo3")
    public String Demo3() throws FileNotFoundException {
        File file = new File("D://abc.txt");
        FileInputStream fis = new FileInputStream(file);
        return "Hello Demo3";
    }
}

GlobalExceptionHandler

@ControllerAdvice
@RestController
public class GlobalExceptionHandler {

    @ExceptionHandler(ArithmeticException.class)
    public String handleArithmeticException(Exception e) {
        return "handle ArithmeticException";
    }

    @ExceptionHandler(FileNotFoundException.class)
    public String handleFileNotFoundException(Exception e) {
        return "handle FileNotFoundException";
    }

    @ExceptionHandler(IndexOutOfBoundsException.class)
    public String handleIndexOutOfBoundsException(Exception e) {
        return "handle IndexOutOfBoundsException";
    }

}

Demo

demo01
https://ithelp.ithome.com.tw/upload/images/20241017/20128084dD05FzL55y.png
demo02,當Controller中有ExceptionHandler時,會以該Controller中的Handler優先
https://ithelp.ithome.com.tw/upload/images/20241017/2012808495rdeXmB1Q.png
demo03
https://ithelp.ithome.com.tw/upload/images/20241017/20128084Ym2toIImsp.png

Reference


上一篇
Day31 Spring MVC - Interceptor
下一篇
Day34 Spring MVC - Validation
系列文
從Servlet到Spring MVC36
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言